package com.wuxf.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;

/**
 * 项目名称：snam_cloud_platform
 * 类名称：DateUtils
 * 类描述：TODO
 * 创建人：WM
 * 创建时间：2015-3-12 下午1:55:53
 * 修改人：WM
 * 修改时间：2015-3-12 下午1:55:53
 * 修改备注：
 * @version Ver 1.0
 */
public class DateUtils {
	/**缺省日期格式*/
	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";

	/**缺省日期格式*/
	public static final String DEFAULT_DATE_FORMAT_YM = "yyyyMM";

	/**缺省时间格式*/
	public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
	
	/**缺省时间格式-时分秒*/
	public static final String DEFAULT_TIME_FORMAT_HMS = "HHmmss";

	/**缺省记录日期格式-24小时制*/
	public static final String DEFAULT_RECORD_TIME_FORMAT = "yyyyMMddHHmmssSSS";
	
	/**缺省记录日期格式-24小时制*/
	public static final String NORMAL_TIME_FORMAT = "yyyyMMddHHmmss";

	/**缺省记录日期格式-年月日*/
	public static final String DEFAULT_DATE_FORMAT_YMD = "yyyyMMdd";

	/**月日时分*/
	public static final String DEFAULT_DATE_FORMAT_MDHM = "yyyyMMdd";

	/**缺省月格式*/
	public static final String DEFAULT_MONTH = "MONTH";

	/**缺省年格式*/
	public static final String DEFAULT_YEAR = "YEAR";

	/**缺省日格式*/
	public static final String DEFAULT_DATE = "DAY";

	/**缺省小时格式*/
	public static final String DEFAULT_HOUR = "HOUR";

	/**缺省分钟格式*/
	public static final String DEFAULT_MINUTE = "MINUTE";

	/**缺省秒格式*/
	public static final String DEFAULT_SECOND = "SECOND";

	/**缺省长日期格式*/
	public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH-mm";

	/**缺省长日期格式,精确到秒*/
	public static final String DEFAULT_DATETIME_FORMAT_SEC = "yyyy-MM-dd HH:mm:ss";

	/**缺省长日期格式,精确到毫秒*/
	public static final String DEFAULT_DATETIME_FORMAT_SEC_2 = "yyyy-MM-dd HH:mm:ss.ms";
	
	/**
	 * 时间格式 ：yyyy-mm-dd hh24:mi:ss
	 */
	public static final String DATE_FORMAT_YMDHMS = "yyyy-mm-dd hh24:mi:ss";
	
	/**
	 * 时间格式 ：yyyy-mm-dd hh24:mi:ss.ff
	 */
	public static final String DATE_FORMAT_YMDHMS_FF = "yyyy-mm-dd hh24:mi:ss.ff";
	
	/**
	 * 时间格式 ：yyyy-MM-dd HH:mm:ss.SSSSSS
	 */
	public static final String DATE_FORMAT_YMDHMSS = "yyyy-MM-dd HH:mm:ss.SSSSSS";
	

	/**星期数组*/
	public static final String[] WEEKS = { "星期日", "星期一", "星期二", "星期三", "星期四",
			"星期五", "星期六" };

	public static String DEFAULT_YM_FORMAT = "yyyy-MM";

	/**
	 * 取当前日期的字符串表示
	 * @return 当前日期的字符串 ,如2010-05-28
	 **/
	public static String today() {
		return today(DEFAULT_DATE_FORMAT);
	}

	/**
	 * 根据输入的格式得到当前日期的字符串
	 * @param strFormat 日期格式
	 * @return
	 */
	public static String today(String strFormat) {
		return toString(new Date(), strFormat);
	}

	/**
	 * 取当前时间的字符串表示,
	 * @return 当前时间,如:21:10:12
	 **/
	public static String currentTime() {
		return currentTime(DEFAULT_TIME_FORMAT);
	}

	/**
	 * 根据输入的格式获取时间的字符串表示
	 * @param 输出格式,如'hh:mm:ss'
	 * @return 当前时间,如:21:10:12
	 **/

	public static String currentTime(String strFormat) {
		return toString(new Date(), strFormat);
	}

	/**
	 * 取得相对于当前时间增加天数/月数/年数后的日期
	 * <br>
	 * 欲取得当前日期5天前的日期,可做如下调用:<br>
	 * 		getAddDay("DATE", -5).
	 * @param field,段,如"year","month","date",对大小写不敏感
	 * @param amount,增加的数量(减少用负数表示),如5,-1
	 * @return	格式化后的字符串 如"2010-05-28"
	 * @throws ParseException
	 **/

	public static String getAddDay(String field, int amount)
		throws ParseException {
		return getAddDay(field, amount, null);
	}

	/**
	 * 取得相对于当前时间增加天数/月数/年数后的日期,按指定格式输出
	 *
	 * 欲取得当前日期5天前的日期,可做如下调用:<br>
	 * 		getAddDay("DATE", -5,'yyyy-mm-dd hh:mm').
	 * @param field,段,如"year","month","date",对大小写不敏感
	 * @param amount,增加的数量(减少用负数表示),如5,-1
	 * @param strFormat,输出格式,如"yyyy-mm-dd","yyyy-mm-dd hh:mm"
	 * @return 格式化后的字符串 如"2010-05-28"
	 * @throws ParseException
	 **/
	public static String getAddDay(String field, int amount, String strFormat)
		throws ParseException {
		return getAddDay(null, field, amount, strFormat);
	}

	/**
	 * 根据指定日期获得当月第一天
	 *
	 * @param strFormat, 指定日期
	 * @return String类型 当月第一天
	 * @throws ParseException
	 **/
	public static String getTheFristDay(String strFormat)
		throws ParseException {
		SimpleDateFormat datef = new SimpleDateFormat("yyyy-MM-dd");
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(datef.parse(strFormat));
		calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
				1);
		Date date = calendar.getTime();
		String date1 = datef.format(date);
		return date1;
	}

	/**
	 * 根据指定日期获得当月最后一天
	 *
	 * @param strFormat, 指定日期
	 * @return String类型 当月最后一天
	 * @throws ParseException
	 **/
	public static String getTheEndDay(String strFormat)
		throws ParseException {
		SimpleDateFormat datef = new SimpleDateFormat("yyyy-MM-dd");
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(datef.parse(strFormat));
		calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
				1);
		calendar.roll(Calendar.DATE, -1);
		Date date = calendar.getTime();
		String date1 = datef.format(date);
		return date1;
	}

	/**
	 * 功能：对于给定的时间增加天数/月数/年数后的日期,按指定格式输出
	 *
	 * @param date String 要改变的日期
	 * @param field int 日期改变的字段，YEAR,MONTH,DAY
	 * @param amount int 改变量
	 * @param strFormat 日期返回格式
	 * @return
	 * @throws ParseException
	 */
	public static String getAddDay(String date, String field, int amount,
			String strFormat)
		throws ParseException {
		if (strFormat == null) {
			strFormat = DEFAULT_DATETIME_FORMAT_SEC;
		}
		Calendar rightNow = Calendar.getInstance();
		if (date != null && !"".equals(date.trim())) {
			rightNow.setTime(parseDate(date, strFormat));
		}
		if (field == null) {
			return toString(rightNow.getTime(), strFormat);
		}
		rightNow.add(getInterval(field), amount);
		return toString(rightNow.getTime(), strFormat);
	}

	/**
	 * 获取时间间隔类型
	 * @param field 时间间隔类型
	 * @return 日历的时间间隔
	 */
	protected static int getInterval(String field) {
		String tmpField = field.toUpperCase();
		if (tmpField.equals(DEFAULT_YEAR)) {
			return Calendar.YEAR;
		}
		else if (tmpField.equals(DEFAULT_MONTH)) {
			return Calendar.MONTH;
		}
		else if (tmpField.equals(DEFAULT_DATE)) {
			return Calendar.DATE;
		}
		else if (DEFAULT_HOUR.equals(tmpField)) {
			return Calendar.HOUR;
		}
		else if (DEFAULT_MINUTE.equals(tmpField)) {
			return Calendar.MINUTE;
		}
		else {
			return Calendar.SECOND;
		}
	}

	/**
	 * 获取格式化对象
	 * @param strFormat 格式化的格式 如"yyyy-MM-dd"
	 * @return 格式化对象
	 */
	public static SimpleDateFormat getSimpleDateFormat(String strFormat) {
		if (strFormat != null && !"".equals(strFormat.trim())) {
			return new SimpleDateFormat(strFormat);
		}
		else {
			return new SimpleDateFormat();
		}
	}

	/**
	 * 得到当前日期的星期数
	 * @return 当前日期的星期的字符串
	 * @throws ParseException
	 */
	public static String getWeekOfMonth()
		throws ParseException {
		return getWeekOfMonth(null, null);
	}

	/**
	 * 根据日期的到给定日期的在当月中的星期数
	 * @param date 给定日期
	 * @return
	 * @throws ParseException
	 */
	public static String getWeekOfMonth(String date, String fromat)
		throws ParseException {
		Calendar rightNow = Calendar.getInstance();
		if (date != null && !"".equals(date.trim())) {
			rightNow.setTime(parseDate(date, fromat));
		}
		return WEEKS[rightNow.get(Calendar.WEEK_OF_MONTH)];
	}

	/**
	 * 将java.util.date型按照指定格式转为字符串
	 * @param date  源对象
	 * @param format 想得到的格式字符串
	 * @return 如：2010-05-28
	 */
	public static String toString(Date date, String format) {
		return getSimpleDateFormat(format).format(date);
	}

	/**
	 * 将java.util.date型按照缺省格式转为字符串
	 * @param date 源对象
	 * @return 如：2010-05-28
	 */
	public static String toString(Date date) {
		return toString(date, DEFAULT_DATE_FORMAT);
	}

	/**
	 * 强制类型转换 从串到日期
	 * @param sDate  源字符串，采用yyyy-MM-dd格式
	 * @param sFormat ps
	 * @return 得到的日期对象
	 * @throws ParseException
	 */
	public static Date parseDate(String strDate, String format)
		throws ParseException {
		return getSimpleDateFormat(format).parse(strDate);
	}

	/***
	 * 根据传入的毫秒数和格式，对日期进行格式化输出
	 * @version 2011-7-12
	 * @param object
	 * @param format
	 * @return
	 */
	public static String millisecondFormat(Long millisecond, String format) {
		if (millisecond == null || millisecond <= 0) {
			throw new IllegalArgumentException(String.format("传入的时间毫秒数[%s]不合法",
					"" + millisecond));
		}
		if (format == null || "".equals(format.trim())) {
			format = DEFAULT_DATE_FORMAT;
		}
		return toString(new Date(millisecond), format);
	}

	/**
	 * 强制类型转换 从串到时间戳
	 * @param sDate 源串
	 * @param sFormat 遵循格式
	 * @return 取得的时间戳对象
	 * @throws ParseException
	 */
	public static Timestamp parseTimestamp(String strDate, String format)
		throws ParseException {
		Date utildate = getSimpleDateFormat(format).parse(strDate);
		return new Timestamp(utildate.getTime());
	}

	/**
	 * getCurDate 取当前日期
	 * @return java.util.Date型日期
	 **/
	public static Date getCurDate() {
		return (new Date());
	}

	/**
	 * getCurTimestamp 取当前时间戳
	 * @return java.sql.Timestamp
	 **/
	public static Timestamp getCurTimestamp() {
		return new Timestamp(new Date().getTime());
	}

	/**
	 * getCurTimestamp 取遵循格式的当前时间
	 * @param sFormat 遵循格式
	 * @return java.sql.Timestamp
	 **/
	public static Date getCurDate(String format)
		throws Exception {
		return getSimpleDateFormat(format).parse(toString(new Date(), format));
	}

	/**
	 * Timestamp按照指定格式转为字符串
	 * @param timestamp 源对象
	 * @param format ps（如yyyy.mm.dd）
	 * @return 如：2010-05-28 或2010-05-281 13:21
	 */
	public static String toString(Timestamp timestamp, String format) {
		if (timestamp == null) {
			return "";
		}
		return toString(new Date(timestamp.getTime()), format);
	}

	/**
	 * Timestamp按照缺省格式转为字符串
	 * @param ts 源对象
	 * @return 如：2010-05-28
	 */
	public static String toString(Timestamp ts) {
		return toString(ts, DEFAULT_DATE_FORMAT);
	}

	/**
	 * Timestamp按照缺省格式转为字符串，可指定是否使用长格式
	 * @param timestamp 欲转化之变量Timestamp
	 * @param fullFormat 是否使用长格式
	 * @return 如：2010-05-28 或2010-05-28 21:21
	 */
	public static String toString(Timestamp timestamp, boolean fullFormat) {
		if (fullFormat) {
			return toString(timestamp, DEFAULT_DATETIME_FORMAT_SEC);
		}
		else {
			return toString(timestamp, DEFAULT_DATE_FORMAT);
		}
	}

	/**
	 * 将sqldate型按照指定格式转为字符串
	 * @param sqldate 源对象
	 * @param sFormat ps
	 * @return 如：2010-05-28 或2010-05-28 00:00
	 */
	public static String toString(java.sql.Date sqldate, String sFormat) {
		if (sqldate == null) {
			return "";
		}
		return toString(new Date(sqldate.getTime()), sFormat);
	}

	/**
	 * 将sqldate型按照缺省格式转为字符串
	 * @param sqldate 源对象
	 * @return 如：2010-05-28
	 */
	public static String toString(java.sql.Date sqldate) {
		return toString(sqldate, DEFAULT_DATE_FORMAT);
	}

	/**
	 * 计算日期时间之间的差值， date1得时间必须大于date2的时间
	 * @version 2011-7-12
	 * @param date1
	 * @param date2
	 * @return {@link java.util.Map} Map的键分别为, day(天), hour(小时),minute(分钟)和second(秒)。
	 */
	public static Map<String, Long> timeDifference(final Date date1,
			final Date date2) {
		if (date1 == null || date2 == null) {
			throw new NullPointerException("date1 and date2 can't null");
		}
		long mim1 = date1.getTime();
		long mim2 = date2.getTime();
		if (mim1 < mim2) {
			throw new IllegalArgumentException(String.format(
					"date1[%s] not be less than date2[%s].", mim1 + "", mim2
							+ ""));
		}
		long m = (mim1 - mim2 + 1) / 1000l;
		long mday = 24 * 3600;
		final Map<String, Long> map = new HashMap<String, Long>();
		map.put("day", m / mday);
		m = m % mday;
		map.put("hour", (m) / 3600);
		map.put("minute", (m % 3600) / 60);
		map.put("second", (m % 3600 % 60));
		return map;
	}

	public static Map<String, Integer> compareTo(final Date date1,
			final Date date2) {
		if (date1 == null || date2 == null) {
			return null;
		}
		long time1 = date1.getTime();
		long time2 = date2.getTime();
		long time = Math.max(time1, time2) - Math.min(time1, time2);
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(time);
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("year",
				(calendar.get(Calendar.YEAR) - 1970) > 0 ? (calendar
						.get(Calendar.YEAR) - 1970) : 0);
		map.put("month",
				(calendar.get(Calendar.MONTH) - 1) > 0 ? (calendar
						.get(Calendar.MONTH) - 1) : 0);
		map.put("day",
				(calendar.get(Calendar.DAY_OF_MONTH) - 1) > 0 ? (calendar
						.get(Calendar.DAY_OF_MONTH) - 1) : 0);
		map.put("hour",
				(calendar.get(Calendar.HOUR_OF_DAY) - 8) > 0 ? (calendar
						.get(Calendar.HOUR_OF_DAY) - 8) : 0);
		map.put("minute",
				calendar.get(Calendar.MINUTE) > 0 ? calendar
						.get(Calendar.MINUTE) : 0);
		map.put("second",
				calendar.get(Calendar.SECOND) > 0 ? calendar
						.get(Calendar.SECOND) : 0);
		return map;
	}

	public static String getCurrentYM() {
		return new SimpleDateFormat(DEFAULT_YM_FORMAT).format(new Date());
	}

	/**
	 * getLastWeekMonday[获取本周星期一,即本周第一天]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月10日 下午12:58:40
	 *
	 * @Title: getLastWeekMonday
	 * @param date
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date getThisWeekMonday(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.add(Calendar.WEEK_OF_YEAR, 0);// 一周
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

		return cal.getTime();
	}
	/**
	 * getThisWeekSunday[获取本周星期天,即本周最后一天]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月10日 下午12:58:59
	 *
	 * @Title: getLastWeekSunday
	 * @param date
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date getThisWeekSunday(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.add(Calendar.WEEK_OF_YEAR, 0);// 一周
		cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
		return cal.getTime();
	}

	/**
	 * getLastWeekMonday[获取上周星期一,即上周第一天]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月10日 下午12:58:40
	 *
	 * @Title: getLastWeekMonday
	 * @param date
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date getLastWeekMonday(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.add(Calendar.WEEK_OF_YEAR, -1);// 一周
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		return cal.getTime();
	}
	
	/**
	 * 取当前时间前一周的时间
	 * @return
	 */
	public static Date getWeekAgo() {
		Calendar calendar = Calendar.getInstance();
	    Date date = new Date();
	    calendar.setTime(date);
	    calendar.add(Calendar.WEEK_OF_YEAR, -1);
	    date = calendar.getTime();
	    return date;
	}
	/**
	 * 取当前时间前一月的时间
	 * @return
	 */
	public static Date getMonthAgo() {
		Calendar calendar = Calendar.getInstance();
	    Date date = new Date();
	    calendar.setTime(date);
	    calendar.add(Calendar.MONTH, -1);
	    date = calendar.getTime();
	    return date;
	}
	
	
	
	/**
	 * getLastWeekSunday[获取上周星期天,即上周最后一天]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月10日 下午12:58:59
	 *
	 * @Title: getLastWeekSunday
	 * @param date
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date getLastWeekSunday(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.add(Calendar.WEEK_OF_YEAR, -1);// 一周
		cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
		return cal.getTime();
	}

	/**
	 * getNextDay[获取昨天日期]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月10日 下午1:06:13
	 *
	 * @Title: getNextDay
	 * @param date
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date getNextDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, 1);
		date = calendar.getTime();
		return date;
	}

	/**
	 * getHowLongDay[获取距离改时间多少天时间的日期]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月10日 下午1:06:13
	 *
	 * @Title: getHowLongDay
	 * @param date
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date getHowLongDay(Date date, int num) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, num);
		date = calendar.getTime();
		return date;
	}

	/**
	  * 获取现在时间
	  *
	  * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
	  */
	public static String getStringDate() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateString = formatter.format(currentTime);
		return dateString;
	}

	/**
	  * 获取现在时间
	  *
	  * @return返回字符串格式 yyyyMMddHHmmss
	  */
	public static String getStringDate(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
		String dateString = formatter.format(date);
		return dateString;
	}

	/**
	  * 获取现在时间到分钟
	  *
	  * @return返回字符串格式 yyyy-MM-dd HH:mm
	  */
	public static String getStringMinuteDate(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		String dateString = formatter.format(date);
		return dateString;
	}

	/**
	  * 获取现在时间
	  *
	  * @return 返回短时间字符串格式yyyy-MM-dd
	  */
	public static String getStringDateShort() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		String dateString = formatter.format(currentTime);
		return dateString;
	}

	/**
	  * 获取现在时间
	  *
	  * @return 返回短时间字符串格式yyyy-MM-dd
	  */
	public static String getStringShort(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		String dateString = formatter.format(date);
		return dateString;
	}

	/**
	 * getStringDateShort[转换日期时间，格式为：yyyyMMdd]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月10日 下午1:08:40
	 *
	 * @Title: getStringDateShort
	 * @param date
	 * @return
	 * @return String [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static String getStringDateShort(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		String dateString = formatter.format(date);
		return dateString;
	}

	/**
	 * parseStrToDate[转换日期时间，格式为：yyyyMMddHHmmss]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月11日 上午10:01:23
	 *
	 * @Title: parseStrToDate
	 * @param time
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date parseStrToDate(String time) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
		Date sd = new Date();
		try {
			sd = formatter.parse(time);
		}
		catch (ParseException e) {
			e.printStackTrace();
		}
		return sd;
	}
	/**
	 * parseStrToShortDate[转换日期时间，格式为：yyyy-MM-dd]
	 * 创建人:  MJP
	 * 创建时间: 2016年3月11日 上午10:01:23
	 *
	 * @Title: parseStrToShortDate
	 * @param time
	 * @return
	 * @return Date [返回类型][简述]
	 * @Exception [异常对象]
	 * @since  CodingExample　Ver(编码范例查看) 1.1
	*/
	public static Date parseStrToShortDate(String time) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date sd = new Date();
		try {
			sd = formatter.parse(time);
		}
		catch (ParseException e) {
			System.out.println(e.toString());
		}
		return sd;
	}
	

	/**
	 * 返回 当前 日期
	 * @Title: getCurrentDate 
	 * @param formatStr
	 * @return
	 * String
	 * @author: zhangwei
	 * @date: 2016年9月28日 上午11:26:27
	 */
	public static String getCurrentDate(String formatStr){
		
		SimpleDateFormat sdf =new SimpleDateFormat(formatStr);
		String currentDate = sdf.format(new Date());
		
		return currentDate;
	}
	
	/**
	 * 格式化 日期
	 * @Title: formatDate 
	 * @param formatStr
	 * @param date
	 * @return
	 * String
	 * @author: zhangwei
	 * @date: 2016年9月29日 下午5:25:47
	 */
	public static String formatDate(String formatStr,String date){
		SimpleDateFormat sdf =new SimpleDateFormat(formatStr);
		String resultDate = "";
		try {
			resultDate = sdf.format(sdf.parse(date));
		} catch (ParseException e) {
			System.out.println(e.toString());
		}
		return resultDate;
	}
	
	/**
	 * 判断当前 日期 是否 在 个给定日期 范围 内
	 * @Title: compareRange 
	 * @param star
	 * @param end
	 * @return
	 * boolean
	 * @author: zhangwei
	 * @date: 2016年10月9日 下午4:08:20
	 */
	public static boolean compareRange(String star, String end) {
		boolean result = false;
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
		try {
			Date sdate = sdf.parse(star);
			Date edate = sdf.parse(end);
			result = compareRange(sdate, edate);
		} catch (ParseException e) {
			System.out.println(e.toString());
		}
		return result;
		
	}
	
	/**
	 * 判断当前 日期 是否 在 个给定日期 范围 内
	 * @Title: compareRange 
	 * @param sdate
	 * @param edate
	 * @return
	 * boolean
	 * @author: zhangwei
	 * @date: 2016年10月11日 上午11:50:20
	 */
	public static boolean compareRange(Date sdate, Date edate) {
		boolean result = false;
		long time = System.currentTimeMillis();
		if (time >= sdate.getTime() && time <= edate.getTime()) {
			result = true;
		}
		return result;
		
	}
	
	/**
	 * 两个 日期 比较
	 * @Title: compareDate 
	 * @param date1
	 * @param date2
	 * @return
	 * int
	 * @author: zhangwei
	 * @date: 2016年10月9日 下午4:00:36
	 */
	public static int compareDate(String date1, String date2) {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
		try {
			Date dt1 = sdf.parse(date1);
			Date dt2 = sdf.parse(date2);
			if (dt1.getTime() > dt2.getTime()) {
				return 1;
			} else if (dt1.getTime() < dt2.getTime()) {
				return -1;
			} else {
				return 0;
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return 0;
	}
	/**
	 * 与当前时间比较是否在之后
	  * after:(这里用一句话描述这个方法的作用)
	  * @Title: after
	  * @param timeStr
	  * @return
	  * boolean
	  * 时间:2017年6月25日上午11:35:18
	 * @throws ParseException 
	 */
	public static boolean after(String timeStr){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		Date dateTemp;
		try {
			dateTemp = sdf.parse(timeStr);
			if(dateTemp.getTime() > new Date().getTime()){
				return true;
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	
	
	public static boolean before(String timeStr){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		Date dateTemp;
		try {
			dateTemp = sdf.parse(timeStr);
			if(dateTemp.getTime() < new Date().getTime()){
				return true;
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 获取当前时间字符（带毫秒）
	 * @Title: compareDate 
	 * @return String
	 * @author: wuxiaofan
	 * @date: 2017年6月22日 下午4:00:36
	 */
	public static String getNowDate() {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
		return sdf.format(new Date());
	}
	/**
	 * 获取当前时间字符（带毫秒）
	 * @Title: compareDate 
	 * @return String
	 * @author: wuxiaofan
	 * @date: 2017年6月22日 下午4:00:36
	 */
	public static String getDate(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
		return sdf.format(date);
	}
	
	/**
	 * 获取当前时间字符（带毫秒）
	 * @Title: compareDate 
	 * @return String
	 * @author: wuxiaofan
	 * @date: 2017年6月22日 下午4:00:36
	 */
	public static String getDate(Date date,String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}
	
	/**
	 * 获取传入时间字符串离当前已经过了几天
	 * @Title: compareDate 
	 * @return String
	 * @author: wuxiaofan
	 * @throws ParseException 
	 * @date: 2017年6月22日 下午4:00:36
	 */
	public static Long getDate(String dateStr){
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
		Date date;
		Long days = 0L;
		try {
			date = sdf.parse(dateStr);
			days = timeDifference(new Date(),date).get("day");
			System.out.println(days);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return days;
	}
	public static String getNowTime() {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_TIME_FORMAT_HMS);
		return sdf.format(new Date());
	}
	
	public static String getNowDateByYYYYMMDD() {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT_YMD);
		return sdf.format(new Date());
	}
	
	/**
	 * 将前台传入的时间格式转换
	 * @Title:  
	 * @return String
	 * @author: Nq
	 * @throws ParseException 
	 * @date: 2017年7月5日 下午4:00:36
	 */
	public static String translateTime(String time){
		try {
			SimpleDateFormat oldFormat = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
			SimpleDateFormat newFormat = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
			Date date = oldFormat.parse(time);
			time = newFormat.format(date);
		} catch (ParseException e) {
			System.out.println("页面传入的日期转换错误");
			e.printStackTrace();
		}
		return time;
	}
	
	/**
	 * 将传入的yyyymmddhhmmss转换
	 * @Title:  
	 * @return YYYY-MM-DD HH:MM:SS
	 * @author: Nq
	 * @throws ParseException 
	 * @date: 2017年7月5日 下午4:00:36
	 */
	public static String translateFormatTime(String time){
		try {
			SimpleDateFormat oldFormat = new SimpleDateFormat(NORMAL_TIME_FORMAT);
			SimpleDateFormat newFormat = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
			Date date = oldFormat.parse(time);
			time = newFormat.format(date);
		} catch (ParseException e) {
			System.out.println("页面传入的日期转换错误");
			e.printStackTrace();
		}
		return time;
	}
	
	
	/**
	 * 
	  * translateTime:(这里用一句话描述这个方法的作用)
	  * @Title: translateTime
	  * @return
	  * String
	  * 时间:2017年7月7日下午2:43:51
	 */
	public static String formateTime(String timeStr){
		try {
			SimpleDateFormat newFormat = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
			SimpleDateFormat oldFormat = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
			Date date = oldFormat.parse(timeStr);
			timeStr = newFormat.format(date);
		} catch (ParseException e) {
			System.out.println("页面传入的日期转换错误");
			e.printStackTrace();
		}
		return timeStr;
	}
	
	/**
	 * 将yyyyMMddHHmmss格式的转换成"yyyy-MM-dd HH:mm:ss"
	 * @param timeStr
	 * @return
	 */
	public static String formate(String timeStr){
		try {
			SimpleDateFormat newFormat = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
			SimpleDateFormat oldFormat = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
			Date date = oldFormat.parse(timeStr);
			timeStr = newFormat.format(date);
		} catch (ParseException e) {
			System.out.println("页面传入的日期转换错误");
			e.printStackTrace();
		}
		return timeStr;
	}
	
	
	
	
	/**
	 * 格式化时间戳字符串为日期
	 *@param 时间戳字符串
	 *@return 日期
	 *@throws Exception
	 *@author wuxf
	 *@date 2016年11月16日 下午9:49:13
	 */
	public static Date parseSec(String sec) throws Exception{
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_YMDHMSS);
		return sdf.parse(sec);
	}
	
	
	/**
	 * 格式化时间戳字符串为日期
	 *@param 时间戳字符串
	 *@return 日期
	 *@throws Exception
	 *@author wuxf
	 *@date 2016年11月16日 下午9:49:13
	 */
	public static Date parse(String sec) throws Exception{
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
		if(StringUtils.isNotEmpty(sec)){
			return sdf.parse(sec);
		}
		return null;
		
	}
	/**
	 * 格式化日期为yyyy-MM-dd HH:mm:ss格式字符串
	 *@param 日期
	 *@return 字符串
	 *@throws Exception
	 *@author wuxf
	 *@date 2016年11月16日 下午9:49:13
	 */
	public static String formatSec(Date date) throws Exception{
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
		return sdf.format(date);
	}
	
	/**
	 * 
	* 描述:将 yyyyMMddHHmmssSSS 格式时间转换为 yyyy-MM-dd HH:mm:ss格式的日期
	* @param date
	* @return
	* 方法名:formatSec
	* 返回值:Date
	* 作者:wuxf
	* Date:2018年4月7日 下午1:27:32
	 */
	public static String formatSec(String date){
		String result = "";
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
		SimpleDateFormat sdf2 = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
		try {
			result = sdf.format(sdf2.parse(date));
		} catch (ParseException e) {
		}
		return result;
	}
	/**
	 * 
	* 描述:将 yyyyMMddHHmmssSSS 格式时间转换为 yyyy-MM-dd HH:mm:ss格式的日期
	* @param date
	* @return
	* 方法名:formatSec
	* 返回值:Date
	* 作者:wuxf
	* Date:2018年4月7日 下午1:27:32
	 */
	public static String formatDateStr(String date){
		String result = "";
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
		SimpleDateFormat sdf2 = new SimpleDateFormat(DEFAULT_DATETIME_FORMAT_SEC);
		try {
			result = sdf.format(sdf2.parse(date));
		} catch (ParseException e) {
		}
		return result;
	}
	
	public static String getTodayDate(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT_YMD);
		return sdf.format(date);
	}
	
	public static String getYesterdayDate() {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT_YMD);
		Calendar cal = Calendar.getInstance();
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.add(Calendar.DAY_OF_YEAR, -1);
		return sdf.format(cal.getTime());
	}
	
	public static String getNextYearDate() {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_RECORD_TIME_FORMAT);
		Calendar cal = Calendar.getInstance();
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.add(Calendar.DAY_OF_YEAR, 1);
		return sdf.format(cal.getTime());
	}
	
	public static Date getToDayPlusminus(Date date,int num) {
		Calendar calendar=Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DATE,num);
		return calendar.getTime();
	}
	
	
}

